iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
Modern Web

每天一點 API:打造我的生活小工具系列 第 2

Day02 — 10 分鐘理解 API 與 JSON,完成你的第一支讀取程式

  • 分享至 

  • xImage
  •  

1. API 是什麼?

API(Application Programming Interface,應用程式介面)是一種軟體介面,定義了不同軟體系統之間如何互動的規則和工具。它就像一份「約定」,告訴你的程式(Client)如何向服務端(Server)發出請求,並規定服務端要如何把格式正確的資料回傳給程式。API 並不是資料庫、伺服器或某個軟體產品本身,而是雙方溝通的規則和門面。

簡單來說,API 是一套讓兩個程式互相「講話」的語言規則。舉例來說,當手機 App 想取得天氣資訊時,它會透過 API 向氣象服務說:「請給我今天的天氣」,服務端再用 API 規定好的格式把天氣資料回傳給 App。這樣,App 就不需要知道氣象服務內部的運作細節,只要按照約定好的規則溝通,就能拿到需要的資料。

1.1 為什麼程式設計師常常提到 API,它到底代表什麼意思?

對程式設計師來說,API 是軟體整合和系統溝通的橋樑。它是一套標準化的接口說明,程式設計師可以透過 API 提供的方法來呼叫服務或取得資料,幫助他們快速且安全地開發能與其他系統整合的應用程式。

2. Client 和 Server 是什麼?

Client(客戶端)和 Server(伺服器)是網路架構中兩個基本的角色。Server 是提供資源或服務的電腦,而 Client 則是向 Server 發送請求並接收回應的裝置或應用程式。

  • Client:負責發送請求,通常是啟動操作並要求某項服務,例如開啟網頁的瀏覽器或手機 App。
  • Server:接收 Client 的請求,處理並回傳相應資料或服務。伺服器可同時為多個 Client 提供服務。
    總結來說,API 就是讓 Client 和 Server 依照共同的規則安全有效地交流資料,讓軟體開發更簡單、更有效率,也讓不同系統能順利協同工作。

3. API 在生活中有什麼應用?

API 在日常生活中廣泛存在,特別是手機 App 和網站的背後都仰賴 API 來溝通數據和服務。例如天氣 App 會透過 API 抓取氣象資料,電子商務網站透過 API 處理支付功能,社群媒體平台也用 API 讓不同裝置可以互動。

4. API 的特色是什麼?

API 最大特色是標準化、封裝系統細節,讓開發者專注在使用已提供的服務而無需了解內部複雜實作。API 透過明確的介面,實現應用程式間的模組化整合,提升開發效率與擴充性。

4.1 為什麼不直接傳資料而要用 API?

  • API 支援即時且精準的資料交換,減少因手動傳輸或批次更新帶來的延遲與錯誤。
  • API 可做資料驗證、存取控制和授權,強化安全性與管理。
  • 自動化與可擴展性:API 可依使用者需求動態抓取相關資料,避免多餘的資料傳輸與存儲浪費。

5. API 的資料格式是怎麼樣的?

常見 API 資料格式包括:

  • JSON (JavaScript Object Notation):最廣泛使用,格式輕量且易讀,資料以鍵值對形式呈現。
  • XML (Extensible Markup Language):較為冗長,使用標籤定義結構,傳統 SOAP 服務常用。
  • 表單格式(Form Data):以 URL 編碼的鍵值對形式,用於 HTTP POST 資料提交。

接下來會接著介紹JSON 是什麼、基本格式與常見資料型別。


6. 什麼是 JSON?

JSON(JavaScript Object Notation)是一種純文字、輕量級的資料交換格式,用來儲存和傳送結構化資料。它格式簡潔,人容易閱讀,程式也能輕鬆解析和處理。

6.1 它跟一般的「文字檔」有什麼不同?

一般文字檔只是純文字,沒有規則或結構,程式無法直接理解其內容的意義。而 JSON 有明確的語法規則和結構,能清楚地描述資料,使程式能正確解析和使用,且比其他標記語言(如 XML)更輕巧。

7. JSON 的基本格式是什麼?

JSON 主要用兩種符號來組織資料:

  • 物件 {}:一組由鍵(key)和值(value)組成的資料集合,表示無序的「屬性清單」。
  • 陣列 []:一組有順序的資料列表。

7.1 物件 {}、陣列 [] 分別用來表示什麼?

  • 物件 {} 用來表示有名稱的屬性集合,例如一個人的姓名、年齡等資料鍵值對。
{
  "name": "John",
  "age": 30
}
  • 陣列 [] 表示有順序的資料集合,例如多筆水果名稱或數字列表。
["apple", "banana", "cherry"]

8. JSON 裡常見的資料型別有哪些?

  • 字串(String):用雙引號包住的文字,如 "hello"
  • 數字(Number):整數或浮點數,如 1003.14
  • 布林值(Boolean):truefalse
  • null:表示空值
  • 物件(Object):用 {} 表示的鍵值集合
  • 陣列(Array):用 [] 表示的資料列表

總結,JSON 是格式清晰且易於人讀、程式解析的純文字資料格式,透過物件和陣列組織多種基本資料型別,使資料交換更簡單有效率。


在了解 API 與 JSON 之後,撰寫一個小範例來讀取 JSON 字典。

  1. 準備資料夾(PowerShell)
mkdir day02
cd day02
  1. 建立一個 JSON 檔
  • 用記事本開新檔並存成 data.json(編碼 UTF-8)
{
  "name": "王小明",
  "age": 20,
  "student": true,
  "email": "ming@example.com",
  "hobbies": ["coding", "basketball", "music"],
  "scores": { "math": 92, "english": 85, "science": 88 },
  "address": {
    "city": "Taipei",
    "zip": "100"
  },
  "note": null
}

(小提醒:所有字串與 key 都用雙引號,最後一個元素不要加逗號)

  • 快速檢查格式是否正確(PowerShell)
python -m json.tool .\data.json
  • 若無錯誤會印出漂亮排版的 JSON
{
    "name": "\u738b\u5c0f\u660e",
    "age": 20,
    "student": true,
    "email": "ming@example.com",
    "hobbies": [
        "coding",
        "basketball",
        "music"
    ],
    "scores": {
        "math": 92,
        "english": 85,
        "science": 88
    },
    "address": {
        "city": "Taipei",
        "zip": "100"
    },
    "note": null
}

看到 \uXXXX 是正常的(ASCII 顯示方式,不是亂碼)。

3.建立 Python 範例:讀取與取值

  • 匯入模組
import json  #叫進 Python 內建的 JSON 工具箱,用來把 JSON ⇄ Python 物件互轉
from pathlib import Path  #引入 Path 物件
  • 讀檔函式
def load_json(path: str):  #定義一個函式,負責「從路徑讀 JSON」
    with open(path, "r", encoding="utf-8") as f:  #用讀取模式打開檔案,指定 UTF-8
        return json.load(f)   # 讀檔字串 -> Python 物件(dict/list)
  • 漂亮印出函式
def pretty_print(obj):  #定義一個「美化輸出」的小工具
    print(json.dumps(obj, ensure_ascii=False, indent=2, sort_keys=True))
    #把 Python 物件轉回 JSON 字串再印出
    #ensure_ascii=False:保留中文,不要變成 \uXXXX
    #indent=2:每層縮排 2 格
    #sort_keys=True:依鍵名字母順序排序,輸出更穩定
  • 主流程
def main():
    data_path = Path("data.json")  #建一個指向 data.json 的 路徑物件
    data = load_json(data_path)  #用剛剛的函式把 data.json 讀成 Python 物件
  • 印出整份資料
    print("=== 原始資料(漂亮列印) ===")  #印一個區塊標題
    pretty_print(data)  #用美化函式把整份 JSON 漂亮地顯示出來
  • 指定取值示範
    print("\n=== 指定欄位 ===")  #\n 先換行,再印標題
    print("name:", data["name"])  #從字典取 name
    print("age:", data["age"]) 
    print("email:", data["email"])  
    print("第一個興趣:", data["hobbies"][0])  #hobbies 是 串列,用索引 [0] 取第一個
    print("英文分數:", data["scores"]["english"])  #巢狀取值:scores 是字典,再取 english
    print("城市:", data["address"]["city"])  
    print("note 欄位(可能是 None):", data.get("note"))  
    #用 .get() 安全取值;note 可能是 None(JSON 的 null)
  • 安全取值(避免 KeyError)
    print("\n=== 安全取值(.get) ===")
    print("不存在的欄位:", data.get("not_exist", "預設:沒有這個欄位"))
    #取一個不存在的鍵,用 .get(鍵, 預設值) 來給預設文字、避免報錯
  • 迭代(for 迴圈)
    print("\n=== 逐一列出興趣 ===")
    for i, hobby in enumerate(data["hobbies"], 1):  
    #用 enumerate(…, 1) 從 1 開始編號,逐一走過 hobbies
        print(f"{i}. {hobby}")  #用 f-string 印成「1. coding」這種格式
  • 修改資料並寫回新檔
    data["hobbies"].append("reading")  #在 hobbies 尾端新增一個興趣
    data["scores"]["english"] = 90  # 把英文分數 改為 90
    with open("data_out.json", "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
        #把修改後的 data 寫成 JSON 到檔案
    print("\n已輸出修改後的資料到 data_out.json")  #提示輸出成功
  • Python 標準啟動器
if __name__ == "__main__":  #只有在「直接執行這個檔案」時才會進到下面這行
    main()  #呼叫主程式

執行:(PowerShell)

python .\read_json.py

應該就可以看到:

=== 原始資料(漂亮列印) ===
{
  "address": {
    "city": "Taipei",
    "zip": "100"
  },
  "age": 20,
  "email": "ming@example.com",
  "hobbies": [
    "coding",
    "basketball",
    "music"
  ],
  "name": "王小明",
  "note": null,
  "scores": {
    "english": 85,
    "math": 92,
    "science": 88
  },
  "student": true
}

=== 指定欄位 ===
name: 王小明
age: 20
email: ming@example.com
第一個興趣: coding
英文分數: 85
城市: Taipei
note 欄位(可能是 None): None

=== 安全取值(.get) ===
不存在的欄位: 預設:沒有這個欄位

=== 逐一列出興趣 ===
1. coding
2. basketball
3. music

已輸出修改後的資料到 data_out.json

因為列印的是修改前的資料(來自 data.json),所以終端畫面的漂亮列印看不到 "reading" 和英文分數 90,是合理的。

  • 驗證輸出檔(PowerShell)
dir
python -m json.tool .\data_out.json

看到多了 reading、英文 90 ,就完成了!


上一篇
Day 1 — 從零開始!建立 Python API 開發環境
下一篇
Day03 — 從 API 抓資料到 Python,完成第一次呼叫API
系列文
每天一點 API:打造我的生活小工具3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言